﻿#include "SeqList.h"


//顺序表的初始化
void InitSeqList(SL* s) {
	s->arr = nullptr;
	s->size = 0;
	s->capacity = 0;
}

//顺序表的销毁
void DestroyedSL(SL* s) {
	if (s != nullptr) {
		free(s->arr);
		s->arr = nullptr;
	}
	s->size = 0;
	s->capacity = 0;
}

//顺序表元素的打印
//void printSL(const SL* s) {
//	for (int i = 0; i < s->size; i++) {
//		cout << s->arr[i] << " ";
//	}
//	cout << endl;
//}

//顺序表的增删
//在判断空间容量是否够 若不够需要增容
void SLCheckCapacity(SL* s) {
	if (s->capacity == s->size) {
		//申请空间
		//malloc：申请空间 callo:申请空间并初始化 两个都没有增容的概念
		//增容用realloc  若是申请失败 原先的变为空 所以最好是在申请的时候用一个临时变量申请
		int new_capacoty = s->capacity == 0 ? 4 : s->capacity * 2;
		SLDataType* temp = (SLDataType*)realloc(s->arr, new_capacoty * sizeof(SLDataType));
		//若是申请失败
		if (temp == nullptr) {
			perror("realloc fail!");
			exit(0);
		}
		//申请成功
		s->arr = temp;
		s->capacity = new_capacoty;
	}
}
// 尾插 尾删
void SLPush_Back(SL* s, SLDataType value) {
	//先判断是否为空
	/*if (s == nullptr) {
		return;
	}*/
	assert(s); //断言 判断其是否为空 ， 若为空直接报错

	//在判断空间容量是否够 若不够需要增容
	SLCheckCapacity(s);

	s->arr[s->size] = value;
	s->size++;
}
void SLPop_Back(SL* s) {
	assert(s);//传入的不能为空
	//删除的也不能为空 
	/*if (s->size != 0) {
		return;
	}*/
	//或者
	assert(s->size);

	--s->size;
}
// 头插 头删
void SLPush_Front(SL* s, SLDataType value) {
	//先判断是否为空
	assert(s);
	//在判断空间容量是否够 若不够需要增容
	SLCheckCapacity(s);
	//后移
	for (int i = s->size; i > 0; i--) {
		s->arr[i] = s->arr[i - 1]; // arr[1] = arr[0] 结束
	}
	s->arr[0] = value;
	s->size++;
}
void SLPop_Front(SL* s) {
	assert(s);
	assert(s->size);
	for (int i = 0; i < s->size - 1; i++) {
		s->arr[i] = s->arr[i + 1]; // arr[size-2] = arr[size-1];结束
	}
	--s->size;
}

//指定位置之前插⼊删除数据
void SLInsert(SL* s, int pos, SLDataType value) {
	//先判断是否为空
	assert(s);
	assert(pos >= 0 && pos <= s->size);

	//在判断空间容量是否够 若不够需要增容
	SLCheckCapacity(s);

	for (int i = s->size; i > pos; i--) {
		s->arr[i] = s->arr[i - 1]; // arr[pos+1] = arr[pos] 结束
	}
	s->arr[pos] = value;
	s->size++;
}
void SLErase(SL* s, int pos) {
	assert(s);
	assert(pos >= 0 && pos < s->size);

	for (int i = pos; i < s->size - 1; i++) {
		s->arr[i] = s->arr[i + 1]; // arr[size - 2] = arr[size - 1] 结束
	}
	--s->size;
}

//查找
//int SLFind(SL* s, SLDataType value) {
//	assert(s);
//	for (int i = 0; i < s->size; i++) {
//		if (s->arr[i] == value) {
//			return i; // 查找到该值的下标
//		}
//	}
//	return -1; //未找到
//}
